const arr = [1, 1, 1, 2, 3];

function unique (arr) {
    const res = [];
    for (const item of arr) {
        if (!res.includes(item)) {
            res.push(item);
        }
    }
    return res;
}

const arr1 = [
    { name: {} },
    { name: {} },
    { name: 'zs' },
    'hello world',
    [3, 4, 5],
    [1, 2, 3],
];

function isEqual (v1, v2) {
    const type1 = v1 instanceof Object;
    const type2 = v2 instanceof Object;
    // 如果类型不相等 直接返回false
    if (type1 !== type2) {
        return false;
    }
    // 都是基础数据类型
    if (!type1) {
        return v1 === v2;
    }
    // 都是引用数据类型
    // 一个对象一个数组
    if (v1.constructor !== v2.constructor) {
        return false;
    }
    // 都是对象 || 都是数组
    // 两个对象键值对数量不一样
    if (Object.keys(v1).length !== Object.keys(v2).length) {
        return false;
    }
    for (const k in v1) {
        // 产生两个值 递归比较
        if (!isEqual(v1[k], v2[k])) {
            return false;
        }
    }
    return true;
}

// 面试题 0元写法
function unique (arr) {
    const res = [];
    for (const item of arr) {
        if (!res.some(resItem => isEqual(resItem, item))) {
            res.push(item);
        }
    }
    return res;
}

// 用reduce做去重 500元写法
const uniqueArr = arr1.reduce((prev, current) => { // [1, 2, 3]  [3, 4, 5]
    return prev.some(prevItem => isEqual(prevItem, current))
        ? prev
        : prev.concat([current]);
        // prev: [1, 2, 3]
        // : [...prev, current];
}, []);

// 《深入理解es6》

// w-plan
// 实现Array.prototype.myReduce

console.log(uniqueArr);
// console.log(unique(arr1));
